﻿#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (C) 2008 Rémy HUBSCHER (http://www.trunat.fr/)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#

import os, sys
try:
    from PyQt4.QtGui import QFileDialog, QProgressDialog, QMessageBox, QApplication
    from PyQt4.QtCore import Qt
except ImportError, detail:
    sys.stderr.write(u"Erreur de chargement de PyQt4 : %s" % detail)
    sys.exit(2)
try:
    from PIL import Image
except ImportError, detail:
    sys.stderr.write(u"Erreur de chargement de Python Imaging Library : %s" % detail)
    sys.exit(3)
    
# Ce programme, ouvre une fenêtre qui demande de selectionner le dossier dont
# l'on souhaite redimentionner les images.
#
# Dans ce dossier sera ensuite créer un sous-dossier "site/" qui contiendra un
# exemplaire de chacune des images du dossier selectionné redimmentionnée pour
# tenir dans un cadre de 640x640

# CONSTANTES
SIZE    = (640, 640)
DIRNAME = "site"
QUALITY = 85

def listJPEG(directory):
	"Retourne la liste des fichiers JPEG du dossier courant"
	fileList = [os.path.normcase(f) for f in os.listdir(directory)]
	fileList = [os.path.join(directory, f) for f in fileList if os.path.splitext(f)[1]  in ('.jpg', '.JPG')]
	return fileList

def main():
    # On selectionne le répertoire des images à redimmentionner
    dirName = QFileDialog.getExistingDirectory(None, u"Selectionnez le répertoire d'images")
    if not dirName:
        sys.exit(4)
# Création du sous dossier
    dir     = os.path.join(unicode(dirName), DIRNAME)
    if not os.path.isdir(dir):
        try:
            os.mkdir(dir)
        except OSError, detail:
            QMessageBox.critical(None, u"Erreur de création du répertoire '%s'" % dir, unicode(detail))
        
    # On créer une barre de progression
    # On selectionne tous les fichier JPG du répertoire
    listImage = listJPEG(unicode(dirName))
    # On compte le nombre de fichier
    numFiles  = len(listImage)
    
    progress  = QProgressDialog(u"Redimentionnement en cours...", u"Annuler", 0, numFiles);
    progress.setWindowModality(Qt.WindowModal);

    value = 0
    for image in listImage:
        # On met à jour la barre de chargement
        value += 1
        progress.setValue(value);
        progress.setLabelText(unicode(os.path.basename(image)))
        
    # Si l'utilisateur souhaite annuler
        if progress.wasCanceled():
            break
        
    # On ouvre l'image
        try:
            im = Image.open(image)
        except IOError, detail:
            QMessageBox.critical(None, u"Erreur d'ouverture de l'image '%s'" % image, detail)
            break
            
        # Redimmentionne la photo courante
        # Information de taille de l'image
        x, y = [float(v) for v in im.size]
        
        # Information sur la miniature
        xr, yr = [float(v) for v in SIZE]
        
        # Calcul du RATIO
        r = min(xr/x, yr/y)
        # Redimmentionne l'image à la bonne taille
        im = im.resize((int(x*r), int(y*r)), resample=Image.ANTIALIAS)
        # Enregistre l'image dans le bon répertoire
        thumbs = os.path.join(dir, os.path.basename(image))
        try:
            im.save(thumbs, "JPEG", quality=QUALITY)
        except IOError, detail:
            QMessageBox.critical(None, u"Erreur d'enregistrement de l'image '%s'" % thumbs, detail)
            break
                
    if value == numFiles:
        progress.setValue(numFiles);
        sys.exit(0)
    else:
        QMessageBox.warning(None, u"Attention", u"La création des images a été annulée")
        sys.exit(1)

if __name__=="__main__":
    app = QApplication(sys.argv)
    main()
    app.exec_loop()

